class WxRequest{
  defaults ={
    baseURL:'',
    url:'',
    data:null,
    method:'GET',
    header: {
        'Content-Type': 'application/json' // 设置数据的交互格式
      },
    timeout:6000,
    isLoading:true //是否使用默认的loading
    }

    //定义一个数组队列
    //初使值是一个空数组，用来存储请求队列（存储请求标识）
    queue=[]

    //创建拦截器对象
    interceptors={
      request:(config)=>config,
      response:(response)=>response
    }


  //构造函数，用来初使化属性和方法
  constructor(param={}){
    this.defaults = Object.assign({},this.defaults,param);
  }

  request(options){
    //清除上一次的定时器
    this.timerId && clearTimeout(this.timerId);
    //合并url
    options.url = this.defaults.baseURL+options.url;
    //合并请求的参数对象
    options = {...this.defaults,...options}
    //发送请求前加loading
    //wx.showLoading();
    if(options.isLoading && options.method!=='UPLOAD'){
      //判断queue队列数组是否为空，为空则显示loading
      this.queue.length===0 && wx.showLoading()
      //然后立即向数组queue队列中添加请求标识，每个标识代表一个请求，标识是自定义的
      this.queue.push('request');
    }


    //在发送请求之前，做请求拦截
    options = this.interceptors.request(options)
    return new Promise((resolve,reject)=>{
      if(options.method==='UPLOAD'){
        wx.uploadFile({
          ...options,
          success:(res)=>{
              //需要将服务器返回的JSON转换为对象
              res.data = JSON.parse(res.data);
              //合并参数
              const mergeRes = Object.assign({},res,{config:options,isSuccess:true})
              resolve(this.interceptors.response(mergeRes))
          },
          fail:(err)=>{
            //合并参数
            const megeErr = Object.assign({},err,{config:options,isSuccess:false})
            reject(this.interceptors.response(megeErr))
          }
        })
      }else{
        wx.request({
          ...options,
          success:(res)=>{
            const resParam=Object.assign({},res,{config:options,isSuccess: true})
            //成功的回调
              resolve(this.interceptors.response(resParam));
          },
          fail:(err)=>{
            //失败的回调
            const errParam=Object.assign({},err,{iconfig:options,isSuccess: false})
            //成功的回调
            reject(this.interceptors.response(errParam));
          },
          complete:()=>{
           if(options.isLoading){
              //每次请求完后都从queue队列中删除一个标识
            this.queue.pop();
  
            this.queue.length===0 && this.queue.push('request')
  
            this.timerId = setTimeout(()=>{
              this.queue.pop();
              //删除后需要判断queue队列是否为空，为空则可以隐藏loading
              this.queue.length===0 && wx.hideLoading();
              clearTimeout(this.timerId);
            },1)
           }
          }
        })
      }
    })
  }
     // 封装 GET 实例方法
   get(url, data = {}, config = {}) {
    return this.request(Object.assign({ url, data, method: 'GET' }, config))
   }

   // 封装 POST 实例方法
   post(url, data = {}, config = {}) {
     return this.request(Object.assign({ url, data, method: 'POST' }, config))
   }

   // 封装 PUT 实例方法
   put(url, data = {}, config = {}) {
     return this.request(Object.assign({ url, data, method: 'PUT' }, config))
   }

   // 封装 DELETE 实例方法
   delete(url, data = {}, config = {}) {
     return this.request(Object.assign({ url, data, method: 'DELETE' }, config))
   }

     // 封装处理并发请求的 all 方法
   all(...promise) {
     return Promise.all(promise)
   }
   //
   /**
    * @description upload实例方法，用来封装wx.uploadFile
    * @param {*} url 服务器端的接口路径
    * @param {*} filePath  要上传的资源路径
    * @param {*} name  文件对应的key
    * @param {*} config  其他配置项
    */
   upload(url,filePath,name='file',config={}){
     return this.request( 
       Object.assign({url,filePath,name,method:'UPLOAD'},config)
      )
   }
}

export default WxRequest
